TypeScript 97.6%
SQL 1.4%
JavaScript 0.5%
1import type { Metadata } from "next";2import { notFound } from "next/navigation";3import { apiServer } from "@/lib/api-server";4import type { GameInfo } from "@spinza/shared";5import type { ArcadeGameDefinition, CrashGameDefinition } from "@spinza/game-core/client";6import type { ClientDefinition } from "@/components/game/types";7import { GameClient } from "@/components/game/game-client";8import { CrashClient } from "@/components/crash/crash-client";9import { ArcadeClient } from "@/components/arcade/arcade-client";1011type Params = { params: Promise<{ slug: string }> };1213export async function generateMetadata({ params }: Params): Promise<Metadata> {14 const { slug } = await params;15 const data = await apiServer<{ game: GameInfo }>(`/api/games/${slug}`);16 if (!data) return { title: "Game not found" };17 return { title: `${data.game.name} — play free`, description: data.game.description, robots: { index: false } };18}1920export default async function GamePage({ params }: Params) {21 const { slug } = await params;22 const data = await apiServer<{ game: GameInfo; definition: ClientDefinition | CrashGameDefinition | ArcadeGameDefinition }>(`/api/games/${slug}`);23 if (!data) notFound();24 if (data.game.kind === "crash") return <CrashClient game={data.game} definition={data.definition as CrashGameDefinition} />;25 if (data.game.kind === "arcade") return <ArcadeClient game={data.game} definition={data.definition as ArcadeGameDefinition} />;26 return <GameClient game={data.game} definition={data.definition as ClientDefinition} />;27}28